
package com.zsrt.day20170506.ch01;

/**
 * 单例模式   就是说系统中对于某类的只能有一个对象，不可能出来第二个。
 * @author jmj
 * @date 2017年5月6日
 * @time 下午12:15:04
 */
public class Singleton {
	
	/**
	 * 1 延迟加载 懒加载
	 */
	private static Singleton instance;
	
	private Singleton(){
		
	}
	
	/**
	 * 第一种 线程不安全算法
	 * 
	 * 2.synchronized 保证线程安全且唯一  
	 * 
	 * 3.  双重锁
	 * 双重锁机制 = 双重同步锁  面试的时候写这个代码
	 * 顾名思义，在双重检查锁中，代码会检查两次单例类是否有已存在的实例，一次加锁一次不加锁
	 * 一种只在临界区代码加锁的方法。程序员称其为双重检查锁，因为会有两次检查 _instance == null，一次不加锁，另一次在同步块上加锁。
	 * 双重检查锁（Double Checked Locking of Singleton）

	 * @return
	 */
	public static /*synchronized*/ Singleton getsingleton(){
		
		 if(null ==instance){
			 //双重锁
			 synchronized (Singleton.class) {
				if(null == instance){
					
					instance = new Singleton();
				}
				
			}
		 }
		 
		return instance;
	}
}
